package com.situ.mall.admin.service.impl;

import com.github.pagehelper.PageHelper;
import com.situ.mall.admin.entity.User;
import com.situ.mall.admin.exception.BusinessException;
import com.situ.mall.admin.mapper.UserMapper;
import com.situ.mall.admin.service.IUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.situ.mall.admin.util.RequestUtil;
import com.situ.mall.admin.util.StringUtil;
import com.situ.mall.admin.vo.ForgetPasswordVO;
import com.situ.mall.admin.vo.LayuiTableVO;
import com.situ.mall.admin.vo.ResultVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author membergpf
 * @since 2023-03-18
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
    @Autowired
    UserMapper userMapper;
    @Autowired
    private RedisTemplate redisTemplate;
    @Override
    public void doSave(User user) {
        if(user.getId()==null){
            baseMapper.insert(user);
        }else {
            baseMapper.updateById(user);
        }
    }

    @Override
    public LayuiTableVO list(String keyword,  Integer page, Integer limit) {
        LayuiTableVO vo =new LayuiTableVO();

        //查询之前  ，分页工具介入
        PageHelper.startPage(page,limit);   //加入startPage方法后，后面的查询就开启分页查，自动加limit
        //startpage是一次性的   startpage方法后第一次查询是分页
        List<User> list = baseMapper.selectListPage(keyword);
        vo.setData(list);
        return vo;

    }

    @Override
    public ResultVO add(User user) {
        ResultVO vo = new ResultVO();
        if (user.getId() == null || user.getId().equals("")) {
            user.setPassword(StringUtil.md5(user.getPassword()));
            if (!StringUtil.isNotBlank(user.getUsername())) {
                vo.setCode(1);
                vo.setMsg("用户名不能为空");
                return vo;
            }
            List<User>list = baseMapper.selectListPage(user.getUsername());
            if (list.size() > 0) {
                vo.setCode(1);
                vo.setMsg("用户名已被使用，请更换");
                return vo;
            }
            baseMapper.insert(user);
        } else {
            User user1 =new User();
            user1=baseMapper.selectById(user.getId());
            if(!user1.getPassword().equals(user.getPassword())){
                user.setPassword(StringUtil.md5(user.getPassword()));
            }
            user.setId(user.getId());
            if (!StringUtil.isNotBlank(user.getUsername())) {
                vo.setCode(1);
                vo.setMsg("用户名不能为空");
                return vo;
            }
            List<User> list2 = baseMapper.selectListPage(user.getUsername());
            if (list2.size() > 0) {
                User user2 =new User();
                user2=list2.get(0);
                if(!user2.getId().equals(user.getId())){
                vo.setCode(1);
                vo.setMsg("用户名已被使用，请更换");
                    return vo;
                }else {
                    vo.setCode(0);
                }

            }
            baseMapper.updateById(user);
        }
        return vo;
    }

    @Override
    public ResultVO edit(Integer id) {
        ResultVO vo = new ResultVO();
        User user = baseMapper.selectById(id);
//        List<Admin> admin1 = baseMapper.selectName(admin.getAdminName());
//        if (admin1.size() > 0) {
//            vo.setCode(1);
//            vo.setMsg("用户名已被使用，请更换");
//            return vo;
//        }
        vo.setData(user);
        return vo;
    }

    @Override
    public ResultVO checkPhone(ForgetPasswordVO forgetPass) {
        ResultVO vo = new ResultVO();
        if (forgetPass.getNewPassword().equals(forgetPass.getAgainPassword())) {
            Boolean b = forgetPass.getTel().equals(baseMapper.checkPhone(forgetPass.getUsername()));
            if (b) {
                forgetPass.setNewPassword(StringUtil.md5(forgetPass.getNewPassword()));
                baseMapper.updateByName(forgetPass.getUsername(), forgetPass.getNewPassword());
                vo.setMsg("修改密码成功！");
                vo.setData(null);
            } else {
                vo.setMsg("手机号和账号名不匹配！");
                vo.setData(null);
            }
        } else {
            vo.setMsg("两次输入的密码不相同");
            vo.setData(null);
        }
        return vo;
    }

    @Override
    public Boolean check(String username, String password, HttpSession session) {
        List<User> l = new ArrayList<>();

        Object obj =redisTemplate.opsForValue().get("err-"+username);
        if (obj != null) {
            if((int)obj==5){
                throw new BusinessException("密码连续错误5次，2个小时之后再试！");
            }
        }
        l = baseMapper.selectByUsername(username);
        Boolean b = l.size() > 0 && l.get(0).getPassword().equals(StringUtil.md5(password));

        if (b) {
            RequestUtil.setCurrent(l.get(0));
            redisTemplate.delete("err-"+username);
        }else {//密码错误

            if(obj!=null){
                redisTemplate.opsForValue().set("err-"+username,(int)obj+1,2,TimeUnit.HOURS);
            }else {
                redisTemplate.opsForValue().set("err-" + username, 1, 2, TimeUnit.HOURS);
            }
        }
        return b;
    }

    @Override
    public ResultVO editInformation(String username,String sex, String tel) {
        ResultVO vo = new ResultVO();

            String oldusername = RequestUtil.getAdmin().getUsername();//把session里的名字拿出来
            if(!oldusername.equals(username)){
            List<User> list = baseMapper.selectByUsername(username);
            if (list.size() > 0) {
                vo.setCode(1);
                vo.setMsg("用户名已被使用，请更换");
            } else {
                baseMapper.updateByUsername1(oldusername ,username, sex, tel);//更新数据库
                RequestUtil.getAdmin().setUsername(username);//成功后把新的名字塞进session
                vo.setMsg("修改信息成功");
            }}else {
                baseMapper.updateByUsername1(username, username, sex, tel);
            }

        return vo;
    }
    }

